package util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class KMeans1  {
    public ArrayList<Double> elementi = new ArrayList<Double>();
  public ArrayList<Cluster1> grupe = new ArrayList<Cluster1>();
  public int brojGrupa = 0;
  Random rnd = new Random();

  public void podeliUGRupe(int brojGrupa, double errT)
  {
      this.brojGrupa = brojGrupa;
      if (brojGrupa == 0) return;
      //------------  inicijalizacija -------------
     // for (int i = 0; i < brojGrupa; i++)
      //{
       //   int ii = rnd.Next(elementi.Count);
          Cluster1 grupa1 = new Cluster1();
          grupa1.centar = Collections.max(elementi)/2;//elementi[ii];
          grupe.add(grupa1);
          Cluster1 grupa2 = new Cluster1();
          grupa2.centar = Collections.max(elementi);//elementi[ii];
          grupe.add(grupa2);
     // }
      //------------- iterativno racunanje centara ---
      for (int it = 0; it < 100; it++)
      {
          for (Cluster1 grupa : grupe)
              grupa.elementi = new ArrayList<Double>();
          for (Double cc : elementi)
          {
              int najblizaGrupa = 0;
              for (int i = 0; i < brojGrupa; i++)
              {
                  if (grupe.get(najblizaGrupa).rastojanje(cc) >
                      grupe.get(i).rastojanje(cc))
                  {
                      najblizaGrupa = i;
                  }
              }
              grupe.get(najblizaGrupa).elementi.add(cc);
          }
          double err = 0;
          for (int i = 0; i < brojGrupa; i++)
          {
              err += grupe.get(i).pomeriCentar();
          }
          if (err < errT)
              break;
      }
  }


 public class Cluster1
 {
  public Double centar = new Double(0);
  public ArrayList<Double> elementi = new ArrayList<Double>();

  public double rastojanje(double c)
  {
      return Math.abs(c- centar);
  }

  public double pomeriCentar()
  {
      double s = 0;

      double retVal = 0;
      for (Double c : elementi)
      {
          s += c;

      }
      int n = elementi.size();
      if (n != 0)
      {
          double nCentar = (s / n);
          retVal = rastojanje(nCentar);
          centar = nCentar;
      }
      return retVal;
  }
 }
}